/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package miscelania.tiposgenericos.ListaEnlazadaGenerica;

import java.util.Iterator;

/**
 *
 * @author Christian
 */
public class ListaEnlazadaIterator <E> implements Iterator{
    protected Nodo<E> primero;
    protected int longitud;
    
    /*Constructores*/

    public ListaEnlazadaIterator() {
        primero=null;
        longitud=0;
    }
    
    
    /*Metodos*/
    public int Longitud(){
        return this.longitud;
    }
    
    public void InsertarIni(E dato) {
        Nodo<E> nuevo = new Nodo<E>(dato);
        nuevo.siguiente=primero;
        primero=nuevo;
        this.longitud++;
    }
    public void InsertarFin(E dato) {
        Nodo<E> nuevo = new Nodo<E>(dato);
        this.longitud++;
        Nodo<E> A = primero;
        if (A==null){
            primero=nuevo;
        }
        else{
            while (A.siguiente!=null){A=A.siguiente;}
            A.siguiente=nuevo;
        }
    }
    public boolean Eliminar(E elemento){
        Nodo<E> A = primero, anterior= null;
        boolean bandera = false;
        while(A!=null && !A.dato.equals(elemento)){
            anterior=A;
            A=A.siguiente;
        }
        if (A!=null){
            bandera = true;
            this.longitud--;
            if (anterior == null)
                primero=A.siguiente;
            else
                anterior.siguiente = A.siguiente;
        }
        return bandera;
    }
    public String toString(){
        String lista="";
        for(Nodo<E> A = primero;A!=null;A=A.siguiente){
            lista+=A.dato.toString()+"\n";
        }
        return lista;
    }

    
    
    /*metodos modificados de la interfaz iterator*/
    @Override
    public boolean hasNext() {
        boolean bandera = false;
        if (primero!=null){
            if(primero.siguiente!=null)
                bandera = true;
        }
        return bandera;
    }

    @Override
    public E next() {
        if (hasNext()){
            return primero.siguiente.dato;
        }
        else return (E)"No hay elementos";
    }

    @Override
    public void remove() {
        Eliminar(next());
    }
    
}
